1. Two Sum
https://leetcode.com/problems/two-sum/description/
Definição
Intuição
A ideia é iterar e para cada índice devemos procurar outro índice que contenha um complemento então:
Para encontrar o complemento, usaremos uma tabela de consulta. Não precisamos pré-processar a lista para construir a tabela de consulta; podemos preenchê-la enquanto iteramos a lista.
Para o elemento atual , procure na tabela uma entrada com o chave que nos forneça um índice do complemento ou vazio. Se a entrada existir, retorne a resposta ; caso contrário, adicione a entrada à tabela de consulta e repita o processo.
Ilustração
Lista de exemplo: [1, 2, 0, 4, 6]
Soma desejada: 5
1ª Iteração
Na primeira iteração começa no índice 0 e a tabela de consulta está vazia. O elemento atual é , então devemos procurar o complemento , mas a tabela de consulta está vazia, então apenas adicionamos o elemento atual à tabela de consulta e incrementamos .
| Linha | Chave | Valor |
|---|---|---|
2ª iteração
O elemento atual é , então devemos procurar o complemento , mas não há nenhuma entrada com a chave na tabela, então apenas adicionamos o elemento atual à tabela de consulta e incrementamos .
| Linha | Chave | Valor |
|---|---|---|
| 1 | 1 | 0 |
3ª iteração
O elemento atual é , então devemos procurar o complemento , mas não há nenhuma entrada com a chave na tabela, então apenas adicionamos o elemento atual à tabela de consulta e incrementamos .
| Linha | Chave | Valor |
|---|---|---|
| 1 | 1 | 0 |
| 2 | 2 | 1 |
4ª iteração
O elemento atual é , então devemos procurar o complemento e ele existe na tabela na linha , que nos dá o índice , então a resposta é
| Linha | Chave | Valor |
|---|---|---|
| 1 | 1 | 0 |
| 2 | 2 | 1 |
| 3 | 0 | 2 |
Implementação
Clique para revelar a implementação
class Solution:
def twoSum(self, nums: list[int], target: int) -> list[int]:
visited_numbers: dict[int, int] = {}
for i, n in enumerate(nums):
complement_index = visited_numbers.get(target - n, None)
if complement_index is not None:
return [complement_index, i]
visited_numbers[n] = i
Testes
import pytest
from .solution import Solution
@pytest.mark.parametrize('numbers,target,expected', [
([0, 1], 1, [0, 1]),
([1, 2, 3], 5, [1, 2]),
])
def test_solution(numbers, target, expected):
result = Solution().twoSum(numbers, target)
assert result == expected
Time complexity
No pior caso, o complemento será encontrado no último índice, então precisamos iterar todos os elementos de entrada e preencher/consultar da tabela. A iteração é e as inserções/consultas levam de tempo, supondo que não haja colisões. Portanto, a complexidade de tempo final é .
Space complexity
No pior caso, precisamos preencher a tabela com entradas, então a complexidade do espaço é .